package db

import (
	"fmt"
	"log"
)

// InitRedisData 初始化Redis中的会话数据
func InitRedisData() error {
	log.Println("正在初始化Redis数据...")

	// 清理所有会话数据
	if err := ClearAllSessions(); err != nil {
		return fmt.Errorf("清理会话数据失败: %w", err)
	}

	// 初始化虚拟IP池
	if err := InitVirtualIPPool(); err != nil {
		return fmt.Errorf("初始化虚拟IP池失败: %w", err)
	}

	log.Println("Redis数据初始化完成")
	return nil
}

// ClearAllSessions 清理Redis中的所有会话数据
func ClearAllSessions() error {
	log.Println("正在清理Redis中的会话数据...")

	// 删除所有会话相关的键
	keys, err := RedisClient.Keys(RedisCtx, "sessions:*").Result()
	if err != nil {
		return fmt.Errorf("查找会话键失败: %w", err)
	}

	if len(keys) > 0 {
		if err := RedisClient.Del(RedisCtx, keys...).Err(); err != nil {
			return fmt.Errorf("删除会话数据失败: %w", err)
		}
		log.Printf("已清理 %d 个会话记录", len(keys))
	}

	// 清理虚拟IP使用状态
	if err := RedisClient.Del(RedisCtx, "virtual_ip:used").Err(); err != nil {
		return fmt.Errorf("清理虚拟IP使用状态失败: %w", err)
	}

	log.Println("会话数据清理完成")
	return nil
}

// InitVirtualIPPool 初始化虚拟IP池
func InitVirtualIPPool() error {
	log.Println("正在初始化虚拟IP池...")

	// 清理现有IP池
	if err := RedisClient.Del(RedisCtx, "virtual_ip:pool").Err(); err != nil {
		return fmt.Errorf("清理IP池失败: %w", err)
	}

	// 添加虚拟IP到池中 (10.0.0.1 - 10.0.0.254)
	ipList := make([]string, 0, 254)
	for i := 1; i <= 254; i++ {
		ip := fmt.Sprintf("10.0.0.%d", i)
		ipList = append(ipList, ip)
	}

	// 批量添加IP到池中
	if len(ipList) > 0 {
		if err := RedisClient.SAdd(RedisCtx, "virtual_ip:pool", ipList).Err(); err != nil {
			return fmt.Errorf("添加IP到池失败: %w", err)
		}
	}

	log.Println("虚拟IP池初始化完成，共254个虚拟IP")
	return nil
}
